package com.chihihx.launcher.ext

import android.app.Activity
import android.content.Context
import android.content.res.Configuration
import android.content.res.Resources
import android.os.Build
import android.os.LocaleList
import android.provider.Settings
import androidx.fragment.app.Fragment
import com.chihihx.launcher.bean.LanguageDto
import com.shudong.lib_base.ext.appContext
import java.util.Locale

/**
 * 获取系统支持的语言列表，并去重（保留 en 和 zh），按名称排序
 */
fun Context.getSupportedLanguages(): List<LanguageDto> {
    val list: MutableList<LanguageDto> = ArrayList()
    val locales = Resources.getSystem().assets.locales
    val seenLanguages: MutableSet<String> = HashSet()

    for (tag in locales) {
        val locale = Locale.forLanguageTag(tag)
        val languageCode = locale.language
        val displayName = locale.getDisplayName(locale)

        // 避免重复，但强制保留英文和中文
        if (!seenLanguages.contains(languageCode) || languageCode == "en" || languageCode == "zh") {
            list.add(LanguageDto(displayName, locale.displayLanguage, locale))
        }
        seenLanguages.add(languageCode)
    }

    // 按语言名称排序
    list.sortWith { o1, o2 -> o1.name.compareTo(o2.name) }
    return list
}

/**
 * 获取当前系统语言在支持列表中的索引
 */
fun List<LanguageDto>.getCurrentLanguageIndex(): Int {
    val currentLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Resources.getSystem().configuration.locales[0]
    } else {
        @Suppress("DEPRECATION")
        Resources.getSystem().configuration.locale
    }

    // 精确匹配（语言+地区）
    val index = this.indexOfFirst { it.locale.language == currentLocale.language && it.locale.country == currentLocale.country }

    // 如果没有找到完全匹配，就尝试只匹配语言
    return if (index == -1) {
        this.indexOfFirst { it.locale.language == currentLocale.language }
            .takeIf { it != -1 } ?: 0
    } else {
        index
    }
}





/**
 * 更新应用的语言环境
 */
 fun Configuration.updateAppLocale() {

    val newLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        this.locales[0]
    } else {
        this.locale
    }

    val config = appContext.resources.configuration
    val dm = appContext.resources.displayMetrics

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        config.setLocale(newLocale)
    } else {
        @Suppress("DEPRECATION")
        config.locale = newLocale
    }

    @Suppress("DEPRECATION")
    appContext.resources.updateConfiguration(config, dm)
}




/**
 * 系统签名下：系统范围切换语言（Android 8.0+）
 * 成功会触发 onConfigurationChanged / ACTION_LOCALE_CHANGED
 *
 * @return 是否调用成功（主路径）
 */
fun Context.setSystemLanguageSystemWide(locale: Locale): Boolean {
    // 1) 基于系统当前配置创建新的 Configuration
    val sysConfig = Configuration(resources.configuration)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        sysConfig.setLocales(LocaleList(locale))
        sysConfig.setLayoutDirection(locale)
    } else {
        @Suppress("DEPRECATION")
        sysConfig.locale = locale
    }

    // 2) 通过隐藏 API 更新“持久配置”（真正的系统语言）
    return try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // android.app.ActivityManager.getService().updatePersistentConfiguration(config)
            val amClass = Class.forName("android.app.ActivityManager")
            val getService = amClass.getDeclaredMethod("getService")
            val iAm = getService.invoke(null) // IActivityManager
            val update = iAm.javaClass.getDeclaredMethod(
                "updatePersistentConfiguration",
                Configuration::class.java
            )
            update.invoke(iAm, sysConfig)
        } else {
            // 兼容 O 以下（如果你还要跑更低版本）
            val amnClass = Class.forName("android.app.ActivityManagerNative")
            val getDefault = amnClass.getDeclaredMethod("getDefault")
            val iAm = getDefault.invoke(null) // IActivityManager
            val update = iAm.javaClass.getDeclaredMethod(
                "updatePersistentConfiguration",
                Configuration::class.java
            )
            update.invoke(iAm, sysConfig)
        }
        true
    } catch (t: Throwable) {
        // 3) 兜底：写 system_locales（部分 ROM 需要），再发本地刷新
        try {
            val tag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                locale.toLanguageTag()
            } else {
                @Suppress("DEPRECATION")
                "${locale.language}-${locale.country}"
            }
            // 需要 WRITE_SECURE_SETTINGS（有的 ROM 放在 Global / 有的放在 System）
            Settings.Global.putString(contentResolver, "system_locales", tag)
            @Suppress("DEPRECATION")
            Settings.System.putString(contentResolver, "system_locales", tag)
        } catch (_: Throwable) { /* ignore */ }
        false
    }
}

/** Activity/Fragment 便捷扩展（不调用 recreate，交由 onConfigurationChanged 自行刷新） */
fun Activity.setSystemLanguageSystemWide(locale: Locale): Boolean =
    applicationContext.setSystemLanguageSystemWide(locale)

fun Fragment.setSystemLanguageSystemWide(locale: Locale): Boolean =
    requireContext().applicationContext.setSystemLanguageSystemWide(locale)
